package com.ishitong.platform.common.page;

import org.springframework.util.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页对象. 包含数据及分页信息.
 */
public class Page<T> implements java.io.Serializable {
	private static final long serialVersionUID = -1184342208652272535L;

	protected Log logger = LogFactory.getLog(getClass());

	/**
	 * 每页的记录数
	 */
	private int pageSize;

	/**
	 * 当前页面号，从1开始
	 */
	private int pageNum;

	/**
	 * 当前页中存放的记录
	 */
	private List<T> results;

	/**
	 * 总记录数
	 */
	private long totalCount;

	/**
	 * 构造方法，只构造空页
	 */
	
	private long totalPageCount;
	
	public Page() {
		this(0, 0, 0, new ArrayList<T>());
	}

	/**
	 * pageNum和pageSize同时大于零才有效，如果任何一个小于等于零，
	 * 则会根据data中的数据设置pageSize，同时将pageNum置为第一页。
	 * 
	 * @param pageNum
	 *            当前页号，从1开始
	 * @param pageSize
	 *            单页容量
	 * @param totalCount
	 *            数据库中总记录条数
	 * @param data
	 *            本页包含的数据
	 */
	public Page(int pageNum, int pageSize, long totalCount, List<T> data) {
		if(data==null)
		{
			data=new ArrayList<T>();
		}
		Assert.notNull(data);

		// 如果单页容量小于等于0，默认为当前为第一页，
		if (pageSize <= 0 || pageNum <= 0) {
			pageNum = 1;
			pageSize = data.size();
		}

		this.pageNum = pageNum;
		this.pageSize = pageSize;
		this.totalCount = totalCount;
		this.results = data;
	}

	/**
	 * 取数据库中包含的总记录数
	 * 
	 * @return 总记录数
	 */
	public long getTotalCount() {
		return this.totalCount;
	}

	/**
	 * 取得当前页码，从1开始
	 * 
	 * @return 当前页码
	 */
	public int getPageNum() {
		return pageNum;
	}

	/**
	 * 取总页数
	 * 
	 * @return 总页数
	 */
	public long getTotalPageCount() {
		if (totalCount == 0 || pageSize == 0)
			return 0;
		if (totalCount % pageSize == 0)
			totalPageCount = totalCount / pageSize;
		else
			totalPageCount =  totalCount / pageSize + 1;
		return totalPageCount;
	}

	/**
	 * 取每页数据容量
	 * 
	 * @return 每页数据容量
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 当前页中的记录
	 * 
	 * @return 当前页面的记录列表
	 */
	public List<T> getResults() {
		return results;
	}

	/**
	 * 是否有下一页
	 * 
	 * @return true：有<br>
	 *         false：没有
	 */
	public boolean hasNextPage() {
		return (this.pageNum < this.getTotalPageCount());
	}

	/**
	 * 是否有上一页
	 * 
	 * @return true：有<br>
	 *         flase：没有
	 */
	public boolean hasPreviousPage() {
		return (this.pageNum > 1);
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}

	public void setResults(List<T> results) {
		this.results = results;
	}

	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}

}
